package Controle;

import Segmentacao.Segmentacao;
import Graficos.GraficoHistograma;
import Segmentacao.Rotularizacao;
import Estruturas.HistoricoImagem;
import Interface.TelaHistograma;
import Matriz.ManipulacaoMatriz;
import Segmentacao.Gradiente;
import Segmentacao.Inundacao;
import Segmentacao.PontosMinimo;
import Segmentacao.TransformadaDistancia;
import com.sun.media.jai.widget.DisplayJAI;
import java.awt.Point;
import java.io.File;
import javax.media.jai.JAI;
import javax.media.jai.PlanarImage;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;
import org.jfree.ui.RefineryUtilities;

public class Controle {

    private HistoricoImagem historicoImagem;
    private Segmentacao segmentacao;
    private TelaHistograma telaHistograma;
    private PontosMinimo pontosMinimo;
    private boolean recortar;
    private Point primeiro, segundo;

    public Controle() {
        segmentacao = new Segmentacao();
        telaHistograma = new TelaHistograma();
        pontosMinimo = new PontosMinimo();
        historicoImagem = new HistoricoImagem();
        recortar = false;
        historicoImagem.telaImagemOriginal.setControle(this);
        primeiro = new Point();
        segundo = new Point();
        System.setProperty("com.sun.media.jai.disableMediaLib", "true"); //devido aos erros no histograma
    }

    public void binarizar(int escala){
         historicoImagem.atualizarHistorico(ManipularImagem.binarizarImagem(historicoImagem.getImageAtual(), escala));        
    }

    public void inserirContorno(){
         PlanarImage imagem = historicoImagem.getFirst();
         PlanarImage contornos = historicoImagem.getImageAtual();
         int height = imagem.getHeight();
        int width = imagem.getWidth();
        historicoImagem.atualizarHistorico(
                ManipularImagem.matrizToPlanar(
                ManipulacaoMatriz.inserirContorno(ManipularImagem.planarToMatriz(imagem),
                ManipularImagem.planarToMatriz(contornos), height, width)
                , height, width, imagem));
    }

    public void salvarImagem() {
        JFileChooser fileChooser = new JFileChooser();
        FileNameExtensionFilter filter = new FileNameExtensionFilter("Imagens TIFF", "tif", "tiff");
        fileChooser.setFileFilter(filter);
        fileChooser.setSelectedFile(new File(historicoImagem.getFirstEndereco()));
        int option = fileChooser.showSaveDialog(null);
        if (option == JFileChooser.APPROVE_OPTION) {
            File file = fileChooser.getSelectedFile();
            JAI.create("filestore", historicoImagem.getImageAtual(), file.getAbsolutePath(), "TIFF");
        }
    }

    public void gerarHistograma() {
        RefineryUtilities.centerFrameOnScreen(telaHistograma);
        telaHistograma.getTelahitograma().add(GraficoHistograma.gerarGraficoHistograma(ManipularImagem.gerarHistograma(historicoImagem.getImageAtual())));
        telaHistograma.setVisible(true);
    }

    public void equalizar() {
        historicoImagem.atualizarHistorico(ManipularImagem.equalizarImagem(historicoImagem.getImageAtual()));
    }

    public void gradiente(){
        historicoImagem.atualizarHistorico(Gradiente.calculargradientes(historicoImagem.getImageAtual()));
    }

    public void segmentar() {
        historicoImagem.atualizarHistorico(Inundacao.aplicarWatershed(historicoImagem.getImageAtual()));
    }

    public void corrigirRuido() {
        historicoImagem.atualizarHistorico(Rotularizacao.rotularizar(historicoImagem.getImageAtual()));
    }

    public void desfazer() {
            historicoImagem.voltar();
    }

    public void refazer(){
        historicoImagem.refazer();
    }

    public void buscarPontosBrilhantes() {
          historicoImagem.atualizarHistorico(pontosMinimo.calcularPontosMinimo(historicoImagem.getImageAtual()));
    }

    public void skiz(){
        historicoImagem.atualizarHistorico(TransformadaDistancia.skiz(historicoImagem));
    }

    public void abrirImagem() {
       
        String enderecoImagem = "";
        JFileChooser fileChooser = new JFileChooser();
        fileChooser.setDialogTitle("Abrir Imagem");
        fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
        fileChooser.addChoosableFileFilter(new FileNameExtensionFilter("Imagens TIFF", "tif", "tiff"));
        int result = fileChooser.showOpenDialog(null);
        if (result == JFileChooser.APPROVE_OPTION) {
            File choosedFile = fileChooser.getSelectedFile();
            if (choosedFile != null) {
                enderecoImagem = choosedFile.getAbsolutePath();
                historicoImagem.novaImagem(enderecoImagem);//
            }
        }
    }

    public void recortar() {
        
        setRecortar(true);      // habilita o recorte da imagem;
        PlanarImage imagem = historicoImagem.getImageAtual();
        DisplayJAI display = new DisplayJAI(imagem);

        // ajusta coordenadas da imagem;
        float x0 = getPrimeiro().x - display.getLocation().x;
        float y0 = getPrimeiro().y - display.getLocation().y;
        float x = getSegundo().x - display.getLocation().x;
        float y = getSegundo().y - display.getLocation().y;

        // ajusta dimensões;
        float largura = x - x0;
        float altura = y - y0;

        // recorta a imagem;
        historicoImagem.atualizarHistorico(
                ManipularImagem.recortar(imagem, x0, y0, altura, largura));

        // desabilita o recorte;
        setRecortar(false);
    }

    public boolean isRecortar() {
        return recortar;
    }

    public void setRecortar(boolean recortar) {
        this.recortar = recortar;
    }

    public Point getPrimeiro() {
        return primeiro;
    }

    public void setPrimeiro(Point primeiro) {
        this.primeiro = primeiro;
    }

    public Point getSegundo() {
        return segundo;
    }

    public void setSegundo(Point segundo) {
        this.segundo = segundo;
    }
    
}
